/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2000-2006
* Sleepycat Software. All rights reserved.
*
* $Id: FastInputStream.java,v 1.1 2006/05/06 09:01:45 ckaestne Exp $
*/
package com.sleepycat.util;
import java.io.IOException;
import java.io.InputStream;
/**
* A replacement for ByteArrayInputStream that does not synchronize every
* byte read.
*
* <p>This class extends {@link InputStream} and its <code>read()</code>
* methods allow it to be used as a standard input stream. In addition, it
* provides <code>readFast()</code> methods that are not declared to throw
* <code>IOException</code>. <code>IOException</code> is never thrown by this
* class.</p>
*
* @author Mark Hayes
*/
public class FastInputStream extends InputStream {
protected int len;
protected int off;
protected int mark;
protected byte[] buf;
/**
* Creates an input stream.
*
* @param buffer the data to read.
*/
public FastInputStream(byte[] buffer) {
buf = buffer;
len = buffer.length;
}
/**
* Creates an input stream.
*
* @param buffer the data to read.
*
* @param offset the byte offset at which to begin reading.
*
* @param length the number of bytes to read.
*/
public FastInputStream(byte[] buffer, int offset, int length) {
buf = buffer;
off = offset;
len = length;
}
// --- begin ByteArrayInputStream compatible methods ---
public int available() {
return len - off;
}
public boolean markSupported() {
return true;
}
public void mark(int pos) {
mark = pos;
}
public void reset() {
off = mark;
}
public long skip(long count) {
int myCount = (int) count;
if (myCount + off > len) {
myCount = len - off;
}
off += myCount;
return myCount;
}
public int read() throws IOException {
return readFast();
}
public int read(byte[] toBuf) throws IOException {
return readFast(toBuf, 0, toBuf.length);
}
public int read(byte[] toBuf, int offset, int length) throws IOException {
return readFast(toBuf, offset, length);
}
// --- end ByteArrayInputStream compatible methods ---
/**
* Equivalent to <code>read()<code> but does not throw
* <code>IOException</code>.
* @see #read()
*/
public final int readFast() {
return (off < len) ? (buf[off++] & 0xff) : (-1);
}
/**
* Equivalent to <code>read(byte[])<code> but does not throw
* <code>IOException</code>.
* @see #read(byte[])
*/
public final int readFast(byte[] toBuf) {
return readFast(toBuf, 0, toBuf.length);
}
/**
* Equivalent to <code>read(byte[],int,int)<code> but does not throw
* <code>IOException</code>.
* @see #read(byte[],int,int)
*/
public final int readFast(byte[] toBuf, int offset, int length) {
int avail = len - off;
if (avail <= 0) {
return -1;
}
if (length > avail) {
length = avail;
}
System.arraycopy(buf, off, toBuf, offset, length);
off += length;
return length;
}
/**
* Returns the underlying data being read.
*
* @return the underlying data.
*/
public final byte[] getBufferBytes() {
return buf;
}
/**
* Returns the offset at which data is being read from the buffer.
*
* @return the offset at which data is being read.
*/
public final int getBufferOffset() {
return off;
}
/**
* Returns the end of the buffer being read.
*
* @return the end of the buffer.
*/
public final int getBufferLength() {
return len;
}
}